public class Dome4 {
    public static void main(String[] args) {
//        try{
//            func();
//        }catch(ArrayIndexOutOfBoundsException e){
//            e.printStackTrace();
//        }
        func();
        System.out.println("after try catch");
    }
    public static void func(){
        int[]arr={1,2,3};
        System.out.println(arr[100]);
        //此处实际是func自己的错误，但是main调用了，func不处理这个，只能让main里面去捕获
        //如果main也不捕获，那么就只能和最开始没有学习try-catch一样，jvm处理，然后就出错了

        //
        //可以看到没有捕获的话，程序以及异常终止了，没有执行到出错的后面那句
        //
        //异常处理流程总结
        //1.程序先执行try中的代码
        //2.如果try中的代码发生异常，就会结束try中的代码，看和catch中的异常类型是否一致（或者匹配）
        //3.如果找到匹配的异常类型，就会执行catch中代码
        //4.如果没有找的匹配的异常类型，就会异常向上传递到上层的调用者
        //5.无论是否找到匹配的异常类型，finally中的代码都会被执行到（在覆盖方法结束之前执行，也就是返回之前）
        //6.如果上层调用者也没有处理的了异常，就继续向上传递
        //7.一致到main方法也没有合适的代码异常处理，就会交给jvm来进行处理，此时程序就会异常种植
        //

        //自定义异常类
        //java中虽然已经内置了非常丰富的异常类，但是并没能完全表示实际开发中所遇到的一些异常，此时就需要维护符合我们实际情况的结构
        //例如我们实现一个用户登录功能
        //
        //1.自定义异常类，然后继承运行时异常和编译时异常，
        //2.实现一个带有String类型参数的构造方法，参数含义：出现异常的原因
    }
}

